#include "mechanoidPanelAdaptor.h"

mechanoidPanelAdaptor::mechanoidPanelAdaptor(shell::Access_interface & shell)
    : _shell(shell)
{
    // Создаем виджет и устанавливаем для него QGridLayout
    _widget = new QWidget();
    QGridLayout *layout = new QGridLayout(_widget); // Указываем родителя для layout

    // Создаем три виджета
    _mechanoid = new mechanoid();
    _logWidget = new LogWidget();
    _dataPanel = new DataPanel();

    // Установка минимального размера для каждого виджета
    _mechanoid->setMinimumSize(400, 400);
    _logWidget->setMinimumSize(300, 300);
    _dataPanel->setMinimumSize(300, 300);

    // Добавляем виджеты в сетку
    layout->addWidget(_mechanoid, 0, 0, 2, 3); // виджет 1 занимает 2 строки и 3 столбца
    layout->addWidget(_logWidget, 0, 3); // виджет 2 находится в правом верхнем углу
    layout->addWidget(_dataPanel, 1, 3); // виджет 3 находится в правом нижнем углу

    // Устанавливаем layout для _widget
    _widget->setLayout(layout);

    //_widget->installEventFilter(this);
}

mechanoidPanelAdaptor::~mechanoidPanelAdaptor()
{
}

QString mechanoidPanelAdaptor::title() const
{
    return _title;
}

void mechanoidPanelAdaptor::started() 
{
}

void mechanoidPanelAdaptor::paused() 
{
}

void mechanoidPanelAdaptor::stoped()
{
}

bool mechanoidPanelAdaptor::acceptData(const QString & func, QVector<QString> & data)
{
    if (func == "init" || func == "panel") {
        if (data.size() == 0 || data.size() % 3 != 0)
            return false;

        QVector<QString> lastThree = data.mid(data.size() - 3);

        _shell.setPanelTitle("Mechanoid", lastThree[0]);
        _shell.risePanel("Mechanoid", lastThree[0]);
        _mechanoid->handleInitialization(lastThree[1].toInt(), lastThree[2].toInt());

        return true;
    }

    if (func == "addSettings") {
        if (data.size() == 0 || data.size() % 4 != 0)
            return false;

        for (auto it = data.constBegin(); it != data.constEnd(); it += 4)
        {
            _mechanoid->handleAddSettings(*it, (it + 1)->toInt(), (it + 2)->toInt(), (it + 3)->toInt());
        }
        return true;
    }

    if (func == "addPoint") {
        if (data.size() == 0 || data.size() % 3 != 0)
            return false;

        for (auto it = data.constBegin(); it < data.constEnd(); it += 4)
        {
            _mechanoid->handleAddPoint(*it, (it + 1)->toFloat(), (it + 2)->toFloat());
        }
        return true;
    }

    if (func == "setPointSize") {
        if (data.size() == 0 || data.size() % 2 != 0)
            return false;

        for (auto it = data.constBegin(); it != data.constEnd(); it += 2)
        {
            _mechanoid->handleSetPointSize(*it, (it + 1)->toInt());
        }
        return true;
    }

    if (func == "removePoint") {
        if (data.size() == 0 || data.size() % 1 != 0)
            return false;

        for (auto it = data.constBegin(); it != data.constEnd(); it += 1)
        {
            _mechanoid->handleRemovePoint(*it);
        }
        return true;
    }

    if (func == "enableLabelView") {
        if (data.size() == 0 || data.size() % 1 != 0)
            return false;

        for (auto it = data.constBegin(); it != data.constEnd(); it += 1)
        {
            _mechanoid->handleEnableLabelView(*it);
        }
        return true;
    }

    if (func == "disableLabelView") {
        if (data.size() == 0 || data.size() % 1 != 0)
            return false;

        for (auto it = data.constBegin(); it != data.constEnd(); it += 1)
        {
            _mechanoid->handleDisableLabelView(*it);
        }
        return true;
    }

    if (func == "sendLogMsg") {
        if (data.size() == 0 || data.size() % 1 != 0)
            return false;

        for (auto it = data.constBegin(); it != data.constEnd(); it += 1)
        {
            _logWidget->addMessage(*it);
        }
        return true;
    }

    if (func == "clearLog") {

        _logWidget->clear();

        return true;
    }

    if (func == "addStatus") {
        if (data.size() == 0 || data.size() % 3 != 0)
            return false;

        for (auto it = data.constBegin(); it != data.constEnd(); it += 3)
        {
            _dataPanel->addStatus(*it, (it + 1)->toInt(), (it + 2)->toInt());
        }
        return true;
    }

    if (func == "updateStatus") {
        if (data.size() == 0 || data.size() % 3 != 0)
            return false;

        for (auto it = data.constBegin(); it != data.constEnd(); it += 3)
        {
            _dataPanel->updateStatus(*it, (it + 1)->toInt(), (it + 2)->toInt());
        }
        return true;
    }

    if (func == "deleteStatus") {
        if (data.size() == 0 || data.size() % 1 != 0)
            return false;

        for (auto it = data.constBegin(); it != data.constEnd(); it += 1)
        {
            _dataPanel->deleteStatus(*it);
        }
        return true;
    }

    return false;
}

